iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
AI & Data

從零到英雄:用GCP建立AI交易體系系列 第 9

Day9 Cloud Run 開始做 hollo world

  • 分享至 

  • xImage
  •  

什麼是Google Cloud Run?

Google Cloud Run是一個運行無伺服器容器的平臺。它允許您輕鬆地在完全管理的環境中運行您的容器,不需要考慮基礎設施。

Cloud Run 中有兩大功能:

  • 服務:在Cloud Run中,可以建立和部署一個或多個服務。每個服務都是一個獨立的容器映像,它可以獨立運行且擁有自己的資源。服務可以根據需要自動調整其執行環境的規模,並且可以透過HTTP請求或事件啟動。
  • 作業:作業在Cloud Run中用於執行一次性的任務或批處理工作。作業通常是不需要持續運行的,它們會在預定時間觸發或當指定的事件發生時執行。

我們的交易程式不需要一直維持運作,只需要在每天的8:30~13:30運作即可,因此非常適合使用作業的功能。

這裡要特別提到目前的 Cloud Run 服務 以及 Cloud Function 的最大運作時間(time out)都是3600秒(一小時),而 Cloud Run 則是 24小時。

作業

建立一個 main.py

import json
import os
import random
import sys
import time

# 檢索由工作定義的環境變數
TASK_INDEX = os.getenv("CLOUD_RUN_TASK_INDEX", 0)
TASK_ATTEMPT = os.getenv("CLOUD_RUN_TASK_ATTEMPT", 0)
# 檢索用戶定義的環境變數
SLEEP_MS = os.getenv("SLEEP_MS", 0)
FAIL_RATE = os.getenv("FAIL_RATE", 0)

# 定義主要腳本
def main(sleep_ms=0, fail_rate=0):
    """
    使用睡眠方法和隨機失敗模擬工作的程式。

    Args:
        sleep_ms: 等待的毫秒數
        fail_rate: 模擬錯誤的機率
    """
    print(f"開始執行工作 #{TASK_INDEX},嘗試 #{TASK_ATTEMPT}...")
    # 通過等待特定的時間來模擬工作
    time.sleep(float(sleep_ms) / 1000)  # 轉換為秒

    # 模擬錯誤
    random_failure(float(fail_rate))

    print(f"完成工作 #{TASK_INDEX}.")

def random_failure(rate):
    """
    基於失敗率引發錯誤

    Args:
        rate: 介於0和1之間的整數
    """
    if rate < 0 or rate > 1:
        # 不重試工作任務的情況下返回
        print(
            f"無效的 FAIL_RATE 環境變數值:{rate}。"
            + "必須是介於0和1之間的浮點數。"
        )
        return

    random_failure = random.random()
    if random_failure < rate:
        raise Exception("工作失敗。")

# 開始腳本
if __name__ == "__main__":
    try:
        main(SLEEP_MS, FAIL_RATE)
    except Exception as err:
        message = (
            f"工作 #{TASK_INDEX}," + f"嘗試 #{TASK_ATTEMPT} 失敗:{str(err)}"
        )

        print(json.dumps({"message": message, "severity": "ERROR"}))
        sys.exit(1)  # 通過退出進程重新嘗試工作任務

Run 作業允許使用者指定要執行的工作數量。以下是示範代碼,展示如何使用內建的 CLOUD_RUN_TASK_INDEX 環境變數。每個工作代表容器的一個運行副本。需要注意的是,這些工作通常可以並行執行。如果每個工作都可以獨立處理一部分數據,那麼使用多個工作非常有用。

每個工作都知道自己的索引,該索引存儲在 CLOUD_RUN_TASK_INDEX 環境變數中。內建的 CLOUD_RUN_TASK_COUNT 環境變數包含了執行作業時通過 --tasks 參數提供的工作數量。

此代碼示例還展示了如何使用內建的 CLOUD_RUN_TASK_ATTEMPT 環境變數來重試工作。這個變數包含了該工作的重試次數,從0開始(表示第一次嘗試),然後每次連續重試時都會增加1,上限為 --max-retries。

此外,代碼中還可以生成錯誤,以測試重試並生成錯誤日誌,以便觀察失敗情況。

此範例程式碼大致把會遇到的問題都有寫進去,我們就先用這個吧。

創建一個沒有副檔名的文件Procfile
在這個文件中加入以下文字:
web: python3 main.py

此文字的意思是告訴部署平台如何啟動應用程序,此例就是要他用py3去啟動。

  • web:這是進程的名稱。它是用於處理Web請求的進程。
  • python3 main.py:這是指定如何啟動應用程序的命令。這裡我們告訴平台使用 Python 3 執行 main.py 文件。

建構容器

Cloud Run 接受使用任何能夠建立容器映像的工具而建置的容器映像,前提是它們遵循容器協議。需要特別指出的是,程式碼必須偵聽 PORT 環境變數所定義連接埠上的 HTTP 請求。 Cloud Run 會將此 PORT 環境變數自動注入您的容器中。

使用 Dockerfile

在本地端使用 Docker 建構映像要安裝 Docker 超麻煩。所以我們選擇使用 Cloud Build 這樣比較簡單。

Cloud Build 服務允許在 Google Cloud 基礎架構上執行構建工作。Cloud Build 可以從 Cloud Storage、Bitbucket 導入源代碼,執行構建,並生成 Docker 容器。

Cloud Build 將構建視為一系列構建步驟的執行,每個構建步驟都在 Docker 容器中運行。無論環境如何,構建步驟都可以執行任何可以在容器中完成的操作。

首先在cmd中導航到含有剛剛的 main.py、Procfile 的資料夾

cd 你的路徑

運行以下程式碼完成部屬

gcloud run jobs deploy job-quickstart --source . --tasks 50 --set-env-vars SLEEP_MS=10000 --set-env-vars FAIL_RATE=0.1 --max-retries 5 --region 配置地點例如:(us-central1) --project=你的project_ID
  • gcloud run jobs deploy job-quickstart:這部分指定了要使用 Google Cloud SDK 中的 gcloud工具執行的命令。

  • --source .:要部署的作業的原始碼位置。. 表示當前資料夾(當前目錄)

  • --tasks 50:要運行的作業的工作數量。

  • --set-env-vars SLEEP_MS=10000:這部分用於設定環境變數。這表示每個工作將等待 10 秒(寫在PY程式中)。

  • --set-env-vars FAIL_RATE=0.1:這表示約 10% 的機率工作將會失敗。

  • --max-retries 5:這部分指定了最大的重試次數為 5 次。

  • --region us-central1:這部分指定了 Cloud Run 服務的區域

  • --project=trade-XXXXXXX:這部分指定了您的 Google Cloud 項目的 ID

接下來如果要運作Cloud Run就只要運作以下原始碼:

gcloud run jobs execute job-quickstart --region 地點

這樣就大功告成我們建立了一個作業!!!
明天我們練習建立 Cloud Schedule 讓他可以呼叫 Cloud Run 作業啟動~


上一篇
Day 8 目前為止重點整理
下一篇
Day 10 Cloud Scheduler 每天叫Cloud Run起床
系列文
從零到英雄:用GCP建立AI交易體系34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言